/**
 * 全局异常处理器 - 统一处理系统异常和错误响应
 *
 * 开发人员：邢珈晟
 * 开发时间：2025-10-20 至 2025-10-25
 * 模块职责：实现全局异常拦截和统一错误响应格式，确保系统异常处理的统一性和用户体验
 *
 * 技术要点：
 * - 业务异常（BizException）的专门处理
 * - 参数校验异常的字段级错误信息提取
 * - 统一错误响应格式和状态码映射
 * - 异常日志记录和监控集成
 * - 开发环境和生产环境的差异化处理
 *
 * 开发故事：负责系统的异常处理架构设计，与业务异常类深度配合，为整个系统提供统一的错误处理机制和用户友好的错误提示。
 */
package com.pbl.config;

import com.pbl.common.exception.BizException;
import com.pbl.common.model.ApiResponse;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(BizException.class)
    public ApiResponse<Void> handleBiz(BizException ex) {
        return ApiResponse.error(ex.getCode(), ex.getMessage());
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ApiResponse<Void> handleValidation(MethodArgumentNotValidException ex) {
        String msg = ex.getBindingResult().getFieldError() != null
                ? ex.getBindingResult().getFieldError().getDefaultMessage()
                : "参数校验失败";
        return ApiResponse.error(HttpStatus.BAD_REQUEST.value(), msg);
    }

    @ExceptionHandler(Exception.class)
    public ApiResponse<Void> handleOthers(Exception ex) {
        return ApiResponse.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage());
    }
}
